package com.xiaoming.e3mall.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xiaoming.e3mall.common.jedis.JedisClient;
import com.xiaoming.e3mall.common.pojo.EasyUIDataGridResult;
import com.xiaoming.e3mall.common.utils.E3Result;
import com.xiaoming.e3mall.common.utils.IDUtils;
import com.xiaoming.e3mall.common.utils.JsonUtils;
import com.xiaoming.e3mall.mapper.TbItemDescMapper;
import com.xiaoming.e3mall.mapper.TbItemMapper;
import com.xiaoming.e3mall.pojo.TbItem;
import com.xiaoming.e3mall.pojo.TbItemDesc;
import com.xiaoming.e3mall.pojo.TbItemExample;
import com.xiaoming.e3mall.service.ItemService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 商品管理
 */

@Service
public class ItemServiceImpl implements ItemService {

    @Autowired
    private TbItemMapper itemMapper;

    @Autowired
    private TbItemDescMapper itemDescMapper;

    @Autowired
    private JedisClient jedisClient;

    @Value("${REDIS_ITEM_PRE}")
    private String REDIS_ITEM_PRE;

    @Value("${ITEM_CACHE_EXPIRE}")
    private Integer ITEM_CACHE_EXPIRE;

    /**
     * 根据id得到商品信息
     */
    @Override
    public TbItem getItemById(long itemId) {
        /**
         * 这里是将查询的商品信息添加到缓存,又因为不可能将每个商品都添加到缓存
         * 所以我们将缓存设置一个过期时间这样就一定程度上减轻了数据库的压力
         */
        try {
            //查询缓存
            String json = jedisClient.get(REDIS_ITEM_PRE + ":" + itemId + "BASE");
            if (StringUtils.isNotBlank(json))
                return JsonUtils.jsonToPojo(json, TbItem.class);

            //缓存中没有查询数据库
            TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
            //将查询的结果添加到缓存中
            try {
                jedisClient.set(REDIS_ITEM_PRE + ":" + itemId + "BASE", JsonUtils.objectToJson(tbItem));
                //设置过期时间
            } catch (Exception e) {
                e.printStackTrace();
            }
            return tbItem;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 查询所有分页列表进行分页处理
     */
    @Override
    public EasyUIDataGridResult getItemList(int page, int rows) {
        //设置分页信息
        //获取第page页 rows条内容 默认查询总数count
        PageHelper.startPage(page, rows);

        //上面语句紧跟着的第一个select方法会被分页
        //执行查询
        TbItemExample example = new TbItemExample();
        List<TbItem> itemList = itemMapper.selectByExample(example);

        //取分页信息(第二种方式)
        PageInfo<TbItem> pageInfo = new PageInfo<>(itemList);

        //创建返回的对象并根据PageInfo封装
        EasyUIDataGridResult result = new EasyUIDataGridResult();
        //设置EasyUi需要的总条数
        result.setTotal((int) pageInfo.getTotal());
        result.setRows(itemList);
        return result;
    }

    /**
     * 增加商品
     */
    @Override
    public E3Result addItem(TbItem item, String desc) {
        /**
         * 不全前台传过来的属性
         */
        //生成商品ID 获取当前时间戳,再加上两位随机数
        long id = IDUtils.genItemId();
        item.setId(id);
        //设置商品状态 //1-正常，2-下架，3-删除
        item.setStatus((byte) 1);
        //设置商品的时间
        item.setCreated(new Date());
        item.setUpdated(new Date());
        //将商品信息 插入表中
        itemMapper.insert(item);

        //将前台传过来的商品的描述信息插入到
        //跟商品信息关联的商品描述表中
        // 创建时间 修改时间  再就是富文本编辑框中的信息
        TbItemDesc itemDesc = new TbItemDesc();
        itemDesc.setItemId(id);
        itemDesc.setItemDesc(desc);
        itemDesc.setCreated(new Date());
        itemDesc.setUpdated(new Date());
        //将商品描述信息插入到数据库中
        itemDescMapper.insert(itemDesc);

        /**
         * 原来这里需要发送mq给 search服务的但是怕出现事物还没提交但是消息已经发送
         * 的bug,我们可以在search服务中Thread.sleep()一下,或者直接将发送的消息
         * 放到controller中
         */

        //返回成功 按前端需要的格式
        E3Result result = new E3Result(null);
        result.setId(id);
        return result;
    }

    @Override
    public TbItemDesc getTbItemDescById(long itemId) {
        try {
            //查询缓存
            String json = jedisClient.get(REDIS_ITEM_PRE + ":" + itemId + ":DESC");
            if (StringUtils.isNotBlank(json))
                return JsonUtils.jsonToPojo(json, TbItemDesc.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //缓存没有,查询数据库
        TbItemDesc itemDesc = itemDescMapper.selectByPrimaryKey(itemId);//根据id查是包含大文本的

        try {
            //将查询出来的数据添加到缓存中
            jedisClient.set(REDIS_ITEM_PRE + ":" + itemId + "DESC", JsonUtils.objectToJson(itemDesc));
            //设置过期时间
            jedisClient.expire(REDIS_ITEM_PRE + ":" + itemId + ":DESC", ITEM_CACHE_EXPIRE);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return itemDesc;
    }

}
